﻿import type {RequestOptions} from '@@/plugin-request/request';
import type {RequestConfig} from '@umijs/max';
import {message} from "antd";

// 与后端约定的响应数据格式
export interface ApiResponse<T> {
  code: number;
  data: T;
  message: string;
}

/**
 * @name 错误处理
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */
export const requestConfig: RequestConfig = {
  withCredentials: true,

  // 请求拦截器
  requestInterceptors: [
    (config: RequestOptions) => {
      // 拦截请求配置，进行个性化处理。
      return config;
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    (response) => {
      // 文件流直接返回
      if (response.config.responseType === 'blob') {
        return response;
      }
      // 请求地址
      const requestPath: string = response.config.url ?? '';

      // 响应
      const {data} = response as unknown as ApiResponse<any>;
      if (!data) {
        throw new Error('服务异常');
      }

      // 错误码处理
      const {code} = data;
      // 未登录，且不为获取用户登录信息接口
      if (
        code === 40100 &&
        !requestPath.includes('user/get/login') &&
        !location.pathname.includes('/user/login')
      ) {
        // 跳转至登录页
        window.location.href = `/user/login?redirect=${window.location.href}`;
        throw new Error('请先登录');
      }

      if (code !== 0) {
        throw new Error(data.message ?? '服务器错误');
        // message.error(data.message ?? '服务器错误');
      }
      return response;
    },
  ],
};

/**
 * 下载文件通用方法
 * @param fetchMethod - 返回 Blob 的异步请求函数
 * @param filename - 下载的文件名（可选，默认为 'download.xlsx'）
 * @example downloadFile(() => {return exportBooksToExcelUsingPost({responseType: 'blob'})},'test.xlsx')
 */
export const downloadFile = async (
    fetchMethod: () => Promise<Blob>,
    filename: string = 'download.xlsx'
) => {
  try {
    const blob = await fetchMethod();
    const url = window.URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = url;
    link.download = filename;
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    window.URL.revokeObjectURL(url);
  } catch (error) {
    console.error('文件下载失败:', error);
  }
};